/**
 * @file yuv1.c
 * @author your name (you@domain.com)
 * @brief 将一个yuv420p 像素数据文件，分离为y 、u 、v 文件
 * @version 0.1
 * @date 2021-04-27
 * 
 * @copyright Copyright (c) 2021
 * 
 */
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>

int simplest_yuv420p_split(char * url, int w, int h, int num);

int main(void)
{
    simplest_yuv420p_split("../resource/sintel_640_360.yuv", 640, 360, 100);
    return 0;
}
/**
 * @brief 将一个yuv文件，分离为y 、u 、v 文件
 * @note 一个 yuv420p 的画面，由 3/2 个大小，其中y 占据了2/2 ，剩下的 u 和 v 分别占据了4/1 。
 *       4:2:0表示2:1的水平取样，垂直2:1采样
 *       第一行有4个Y，2个U。第二行同样有4个Y和2个V。
 *  「Y」表示明亮度（Luminance、Luma），「U」和「V」则是色度、浓度（Chrominance、Chroma）。
 * 其实YUV是模拟信号的称呼，数字信号应该是表示为YCbCr。Cb是蓝色色度，Cr是红色色度
 * @param url 源文件
 * @param w  宽度
 * @param h  高度
 * @param num 帧数
 * @return int  success：0
 */
int simplest_yuv420p_split(char * url, int w, int h, int num)
{
    FILE * fp = fopen(url, "rb+");
    if(fp == NULL) {
        printf("fopen failed[%s] \n", strerror(errno));
        return -1;
    }
    FILE *fp1 = fopen("output_420_y.y", "wb+");
    FILE *fp2 = fopen("output_420_u.u", "wb+");
    FILE *fp3 = fopen("output_420_v.v", "wb+");

    uint8_t * pic = (uint8_t *)malloc(w * h * 3 / 2);

    for (int i = 0; i < num; i++)
    {
        fread(pic, 1, w * h * 3 / 2, fp);//读取一个画面

        fwrite(pic,  1, w * h, fp1);
        fwrite(pic + w * h, 1, w * h / 4, fp2);
        fwrite(pic+ (w * h) + (w * h / 4), 1, w * h / 4 , fp3);
    }

    free(pic);
    fclose(fp);
    fclose(fp1);
    fclose(fp2);
    fclose(fp3);
    
    return 0;
}